/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package utilities;


import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
/**
 *
 * @author Dante Salcedo
 */
public class DateHandler {
    final static long MILLSECS_PER_DAY = 24 * 60 * 60 * 1000; //Milisegundos al día
    final static String FORMAT_DATE = "dd-MM-yyyy";
    final static String FORMAT_HOUR = "hh:mm:ss";

    /**
     * Transforma una fecha tipo Date en una fecha tipo  XMLGregorianCalendar.
     * Los objetos de las clases en el package MappingObject que contengan fecha
     * se les debe setear una ficha tipo XMLGregorianCalendar.
     * @param date es la fecha tipo Date que será transformada a tipo
     * XMLGregorianCalendar
     * @param objectClass es la clase del objeto que posse la fecha, ésta clase
     * debe estar en el package MappingObject en el proyecto de servicios.
     * ejem: transformDate(date, Maintenance.class);
     * @return date tipo XMLGregorianCalendar
     */
    public static XMLGregorianCalendar transformDate(Date date , Class objectClass){

           
            GregorianCalendar gregorianCalendar = new GregorianCalendar();
            gregorianCalendar.setTime(date);

            XMLGregorianCalendar x = null;
            try
            {
                x = DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar);
            }
            catch (DatatypeConfigurationException ex)
            {
                Logger.getLogger(objectClass.getName()).log(Level.SEVERE, null, ex);
            }
            return x;
    }

    public static XMLGregorianCalendar transformHour(Date date , Class objectClass){


            GregorianCalendar gregorianCalendar = new GregorianCalendar();
            gregorianCalendar.setTime(date);

            XMLGregorianCalendar x = null;
            try
            {
                x = DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar);
            }
            catch (DatatypeConfigurationException ex)
            {
                Logger.getLogger(objectClass.getName()).log(Level.SEVERE, null, ex);
            }
            return x;
    }

    /**
     * obtiene la cantidad de días que hay entre 2 fechas.
     * @param beforeDate  de las 2 fechas es la que está desantespués.
     * @param afterDate  de las 2 fechas es la que está después.
     * @return número de días entre las 2 fechas.
     */
    public static long periodDays(Date beforeDate, Date afterDate)
    {
        long days =  ( afterDate.getTime() - beforeDate.getTime() )/ MILLSECS_PER_DAY;
        return days;
    }

    /**
     * comprueba que una fecha no haya pasado o no sea pasado.
     * @param date la fecha que será comprobada
     * @return TRUE: cuando la fecha es hoy o es una fecha futura
     * FALSE: cuando la fecha ya ha pasado.
     */
    public static boolean isTodayOrFuture(Date date)
    {
        Date today = new Date();       

        SimpleDateFormat format = new java.text.SimpleDateFormat(FORMAT_DATE);
        
        if(format.format(date).equals(format.format(today)))
        {
            return true;
        }
        else
        {
            int num = date.compareTo(today);
            if(num == -1)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
        
        
        
    }

    public static String dateToString(Date date){
         SimpleDateFormat format = new java.text.SimpleDateFormat(FORMAT_DATE);
         return format.format(date);
    }
    public static String XMLGregorianCalendarToString(XMLGregorianCalendar date){
         String stringDate = date.toString();
         String year = stringDate.substring(0, 4);
         String month = stringDate.substring(5, 7);
         String day = stringDate.substring(8, 10);;
         String stringD = day+"-"+month+"-"+year;
         return stringD;
    }
    /**
     * Transforma las fechas tipo String contenidas en las tablas
     * en fechas Tipo Date.
     * @param stringDate String de largo 10 con formato "dd-MM-yyyy".
     * @return la fecha tipo Date, si la fecha guardada en la tabla no
     * tiene el formato "dd-MM-yyyy". retorna NULL.
     */
    public static Date stringToDate(String stringDate){
         
        SimpleDateFormat format = new SimpleDateFormat(FORMAT_DATE);
        Date date = null;
        try {
            date = format.parse(stringDate);
        } catch (ParseException ex) {
            ex.printStackTrace();
        }
        return date;         
    }




    



}
